package com.xbongbong.pro.performanceset.pojo.dto;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.xbongbong.paas.pojo.IdNamePojo;
import com.xbongbong.paas.toolbox.wrap.BaseDTO;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;

/**
 * @description: 业绩目标指标保存
 * @Author: hongxiao
 * @date: 2019-02-01 09:07
 * @since v1.0
 */
@Getter
@Setter
@ToString
public class PerformanceSetSaveDTO extends BaseDTO {
    /**
     * 指标id
     */
    private Long id;
    /**
     * 是否启用：0不启用,1启用
     */
    @Min(value = 0, message = "{dto.msg.performanceSetSave.enable.Min}")
    @Max(value = 1, message = "{dto.msg.performanceSetSave.enable.Max}")
    private Integer enable;
    /**
     * 指标名称，最多20个字
     */
    @NotNull(message = "{dto.msg.performanceSetSave.name.NotNull}")
    @Length(min = 1, max = 20, message = "{dto.msg.performanceSetSave.name.Length}")
    private String name;
    /**
     * 指标简介，最多100个字
     */
    @Length(max = 100, message = "{dto.msg.performanceSetSave.memo.Length}")
    private String memo;
    /**
     * 考核对象，只有部门，不填则代表全公司可见。格式：[{"name":"全公司","id":1}]
     */
    private List<IdNamePojo> permissions;
    /**
     * 最小考核周期：1每月,2每周,3每天。当最小考核周期为天，则默认考核方式为“固定数值型”
     */
    @NotNull(message = "{dto.msg.performanceSetSave.minCycle.NotNull}")
    @Min(value = 1, message = "{dto.msg.performanceSetSave.minCycle.Min}")
    @Max(value = 3, message = "{dto.msg.performanceSetSave.minCycle.Max}")
    private Integer minCycle;
    /**
     * 考核方式：1动态数值型,2固定数值型。
     * 动态数值型：每个目标在不同时间段的值不一致；基本通用于所有考核目标
     * 变化数值型：是指每个目标在不同时间段的值都一致；使用于“跟进次数”等考核目标。
     */
    @NotNull(message = "{dto.msg.performanceSetSave.assessType.NotNull}")
    @Min(value = 1, message = "{dto.msg.performanceSetSave.assessType.Min}")
    @Max(value = 2, message = "{dto.msg.performanceSetSave.assessType.Max}")
    private Integer assessType;
    /**
     * 固定数值，当选择“固定数值型”，要填写该值
     */
    private Double fixedValue;
    /**
     * 单位
     */
    @NotNull(message = "{dto.msg.performanceSetSave.unit.NotNull}")
    private String unit;
    /**
     * 单位
     */
    private String unitValue;
    /**
     * 考核的产品id，最多选择10个产品
     */
    @Size(max = 10, message = "{dto.msg.performanceSetSave.assessProduct.Size}")
    private List<Long> assessProduct;
    /**
     * 指标类型：1系统指标,2自定义指标
     */
    @NotNull(message = "指标类型不能为空")
    @Range(min=1,max=2,message = "指标类型传值异常")
    protected Integer statisticsType;
    /**
     * 数据来源，只能有一个，代表主驱动表 格式为：{"appId":1,"menuId":2,"linkAttr":"text_1"}
     */
    private JSONObject driverSources;
    /**
     * 考核指标，{"name":"字段名","attr":"attr1"}。统计的数字型业务字段，如果是获取指标值(且不是求总数)的，则该条件必选
     */
    private JSONObject sourceAttr;
    /**
     * 归属人字段，{"name":"","attr":"userId"}。按照哪一个归属字段统计（如创建人、签订人等）
     */
    private JSONObject belongAttr;
    /**
     * 统计日期，用attrName显示，{"name":"","attr":""}。按照哪一个时间范围字段进行统计（如创建时间、自定义的时间类型字段）
     */
    private JSONObject timeAttr;
    /**
     * 计算方式
     * @see com.xbongbong.paas.enums.AggTypeEnum
     */
    private Integer statisticsWay;
    /**
     * 高级过滤条件 格式：[{}]
     */
    private JSONArray filter;
    /**
     * 穿透展示字段[{"name":"","attr":""}]
     */
    private JSONArray penetrateAttr;
}
